package com.cifer.utils;

import com.cifer.exception.DateFileMissException;
import com.cifer.exception.TimeFileMissException;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import static com.cifer.utils.TimeUtils.parse;


public class FileHandler {
        private static File record = new File("..\\..\\Record");
//    private static File record = new File("E:\\softwareInstall\\witM\\Record");

    //获取Record类下最新的时间文件
    public static File getLatestFile() {
        //拿到最新的文件
        File[] files = record.listFiles();
        if (files.length == 0) {
            throw new DateFileMissException("未找到日期文件数据");
//            return Result.error("未找到日期文件数据");
        }

        //找最新的文件
//        File latestFile=files[0];
//        String latestDateStr = "2000-01-01";
        LocalDate latestDate=LocalDate.parse("2000-01-01");
        int latestId = -1;
        for (int i = 0; i < files.length; i++) {
            //转换成可比较的日期类型
            LocalDate date = null;
            try {
                date = LocalDate.parse(files[i].getName());
            } catch (Exception e) {
                System.out.println("检查到有文件不是日期格式,文件名为："+files[i].getName());
                continue;
            }
            if (date.isAfter(latestDate)) {
//                latestFile=files[i];
                latestId = i;
                latestDate=date;
            }
        }
        File latestFile=files[latestId];

        File[] timeFiles = latestFile.listFiles();
        if (timeFiles.length == 0) {
            throw new TimeFileMissException("未找到时间文件数据");
//            return Result.error("未找到时间文件数据");
        }
//        latestFile = timeFiles[0];
        LocalTime latestTime = parse("00-00-00");
         latestId=-1;
        for (int i = 0; i < timeFiles.length; i++) {
            //转换成可比较的时间类型
//            LocalTime latestTime = parse(latestFile.getName());
            LocalTime time = null;
            try {
                time = parse(timeFiles[i].getName());
            } catch (Exception e) {
                System.out.println("检查到有文件不是时间格式,文件名为："+timeFiles[i].getName());
                continue;
            }
            if (time.isAfter(latestTime)) {
//                latestFile = timeFiles[i];
                latestId=i;
                latestTime=time;
            }
        }
        latestFile=timeFiles[latestId];
        return latestFile;
    }

    //获取Record文件下指定文件
    public static File getFile(String date, String time) {
        if (record.listFiles().length == 0) {
            throw new DateFileMissException("未找到日期文件数据");
//            return Result.error("未找到日期文件数据");
        }
        File dateFile = new File(record, date);
        if (dateFile.listFiles().length == 0) {
            throw new TimeFileMissException("未找到时间文件数据");
        }
        File target = new File(dateFile, time);
        return target;
    }


    //文件拷贝方法
    public static void fileCopy(File sourceFile, File destinationFile) throws IOException {
        FileInputStream fis = new FileInputStream(sourceFile);
        FileOutputStream fos = new FileOutputStream(destinationFile);
        byte[] buff = new byte[1024];
        int length = 0;
        while ((length = fis.read(buff)) != -1) {
            fos.write(buff, 0, length);
        }
        fis.close();
        fos.close();
    }

    //获取Record目录下日期文件名：相应子文件们的map键值对对象
    public static Map<String, List> getDirectoryMap() {
        HashMap<String, List> dirMap = new HashMap<>();
        for (File file : record.listFiles()) {
            //对每一个日期文件，遍历各子文件，并将文件名放入list中
            ArrayList<String> dataList = new ArrayList<>();
            for (File subFile : file.listFiles()) {
                dataList.add(subFile.getName());
            }
            dirMap.put(file.getName(), dataList);
        }
        return dirMap;

    }

    //判断文件路径是否正确
    public static boolean isFilePath(String path) {
        // 正则表达式匹配 Windows 和类 Unix 风格路径及文件名
        String regex = "^([a-zA-Z]:\\\\|/)(?:[\\w\\s!@#$%^&*()-_+=,./?\\u4e00-\\u9fa5]+\\\\|/)*[\\w\\s!@#$%^&*()-_+=,.\\u4e00-\\u9fa5]+\\.?\\w*$";
        return Pattern.matches(regex, path);
    }

    public static void main(String[] args) {
        //测试部分
        System.out.println(getLatestFile().getName());
    }


}
